Optimització de l'ús de memòria de les aplicacions basades en Canigó


Context

Actualment estan desplegades als entorns J2EE corporatius de la Generalitat diferents aplicacions desenvolupades amb Canigó. Aquestes aplicacions fan ús dels diferents serveis que Canigó ha desenvolupat basant-se en frameworks Open Source (Spring, Hibernate, Struts, quartz, etc.), i per tant fan ús dels jars que contenen aquestes llibreries de suport. Com que cada aplicació carrega totes les llibreries que necessita, el consum de recursos als entorns corporatius creix.

Aquesta situació, de càrrega repetida de llibreries, es pot solucionar desplegant els jars de forma compartida, de forma que reduïm considerablement el tamany en memòria de cada aplicació desplegada.

Propostes de solució

La separació proposada es la següent, per fer-ho s'ha tingut que fer servir spring en la seva versió per mòduls.

  • Llibreries compartibles.
acegi-security-0.9.0.jar htmlparser-1.6.jar
activation-1.1.jar httpunit-1.6.jar
AdobeCSAUtils-1.0.jar itext-1.3.1.jar
ajaxtags-1.1.jar jasperreports-1.0.2.jar
ant-1.6.2.jar jaxen-1.1.jar
antlr-2.7.5H3.jar jaxrpc-1.0.jar
aopalliance-1.0.jar jcifs-1.2.6.jar
apache-ldapber-provider-0.9.jar jdbcappender-2.1.01.jar
apacheds-core-0.9.jar jdbm-0.20-dev.jar
apacheds-main-0.9.jar jdom-1.0.jar
apacheds-shared-0.9.jar jdtcore-3.1.0.jar
asm-1.5.3.jar jmock-1.0.1.jar
asn1-ber-0.3.jar jmock-cglib-1.0.1.jar
asn1-codec-0.3.jar jrexx-1.1.1.jar
asn1-der-0.3.jar js-1.6R2.jar
aspectjrt-1.2.jar json-lib-0.6.jar
aspectwerkz-2.0.jar jsr173_api-1.0.jar
aspectwerkz-core-2.0.jar jta-1.0.1B.jar
aspectwerkz-extensions-2.0.jar jtidy-4aug2000r7-dev.jar
aspectwerkz-jdk14-2.0.jar junit-3.8.1.jar
axis-1.3.jar jwebunit-1.2.jar
axis-ant-1.3.jar kerberos-common-0.4.jar
axis-jaxrpc-1.3.jar kerberos-protocol-0.4.jar
axis-saaj-1.3.jar ldap-common-0.9.jar
axis-wsdl4j-1.3.jar ldap-protocol-0.9.jar
backport-util-concurrent-2.0_01_pd.jar log4j-1.2.12.jar
bcprov-jdk14-124.jar mail-1.4.jar
bsf-2.3.0.jar mina-0.7.jar
canigo-services-configuration-2.2.jar mx4j-3.0.1.jar
canigo-services-core-2.2.jar nekohtml-0.9.5.jar
canigo-services-exceptions-2.2.jar ognl-2.6.9.jar
canigo-services-file-2.2.jar ojdbc14_g-10.2.0.1.0.jar
canigo-services-ftp-2.2.jar oro-2.0.8.jar
canigo-services-http-2.2.jar PDFManipulationAPI-1.0.jar
canigo-services-i18n-2.2.jar poi-3.0-alpha3.jar
canigo-services-jms-2.2.jar poi-scratchpad-3.0-alpha3-20061212.jar
canigo-services-logging-2.2.jar qdox-1.5.jar
canigo-services-mailing-2.2.jar quartz-1.4.0.jar
canigo-services-merging-2.2.jar regexp-1.2.jar
canigo-services-ole-2.2.jar saaj-1.0.jar
canigo-services-persistence-2.2.jar saaj-api-1.0.jar
canigo-services-portlets-2.2.jar saaj-impl-1.0.jar
canigo-services-reporting-2.2.jar sapjco-2.1.6.jar
canigo-services-sap-2.2.jar security-5.1.jar
canigo-services-scheduler-2.2.jar servlet-api-2.4.jar
canigo-services-security-2.2.jar snmp-3.0.jar
canigo-services-validation-2.2.jar snmpTrapAppender-1.2.9.jar
canigo-services-webservices-2.2.jar soap-2.3.1.jar
canigo-services-xml-2.2.jar spring-aop.jar
casclient-2.0.11.jar spring-beans.jar
cglib-2.1_2.jar spring-context.jar
cglib-full-2.0.jar spring-core.jar
cglib-nodep-2.1_2.jar spring-dao.jar
commons-attributes-api-2.1.jar spring-hibernate3.jar
commons-attributes-compiler-2.1.jar spring-jdbc.jar
commons-beanutils-1.7.0.jar spring-support.jar
commons-beanutils-core-1.7.0.jar spring-web.jar
commons-chain-1.0.jar spring-webmvc.jar
commons-codec-1.3.jar springmodules-validator-0.4.jar
commons-collections-3.1.jar stax-1.2.0.jar
commons-digester-1.7.jar stax-api-1.0.jar
commons-discovery-0.2.jar trove-1.0.2.jar
commons-fileupload-1.2.jar urlrewrite-3.0.jar
commons-io-1.1.jar valuelist-0.1.7.jar
commons-jelly-tags-fmt-1.0.jar weblogic-1.0.jar
commons-lang-2.1.jar wsdl4j-1.4.jar
commons-logging-1.0.4.jar wstx-asl-2.9.1.jar
commons-logging-api-1.0.4.jar xalan-2.7.0.jar
commons-net-1.4.0.jar xbean-spring-2.1.jar
commons-primitives-20041207.202534.jar xercesImpl-2.7.1.jar
commons-test-0.1.jar xfire-all-1.0-M5.jar
commons-validator-1.3.0.jar xml-apis-1.3.02.jar
connector-api-1.5.jar xmlbeans-2.0-20041214.jar
datamanager-client-1.0.jar xmlbeans-xmlpublic-2.0-20041214.jar
DocumentServicesLibrary-1.0.jar xmlParserAPIs-2.6.2.jar
dom4j-1.6.1.jar xmlpull-1.1.3.1.jar
easymock-1.1.jar xmlunit-1.0.jar
ehcache-1.2.4.jar xom-1.1.jar
emma-2.0.5312.jar xpp3-1.1.3_8.jar
FastInfoset-1.0.jar xstream-1.1.2.jar
hibernate-3.0.5.jar yom-1.0-alpha-2.jar
hsqldb-1.8.0.1.jar  
  • Llibreries no compartibles.
canigo-services-fileupload-2.2.jar
canigo-services-web-2.2.jar
dwr-1.1.3.jar
jsp-api-2.0.jar
jstl-1.1.2.jar
spring-agent.jar
spring-aspects.jar
spring-ibatis.jar
spring-jca.jar
spring-jdo.jar
spring-jms.jar
spring-jmx.jar
spring-jpa.jar
spring-mock.jar
spring-portlet.jar
spring-remoting.jar
spring-struts.jar
spring-tomcat-weaver.jar
spring-toplink.jar
standard-1.0.6.jar
struts-1.2.7.jar
struts-layout-1.2_20051027.jar
struts-menu-2.3.jar

Per publicar de forma que estalviem memòria, tenim varies possibilitats, que es detallen a continuació en funció d'on publiquem les llibreries compartibles.

Opció 1: Publicació al EAR

Copiem les llibreries compartibles al APP-INF/lib del EAR, la resta haurà d'estar al WEB-INF/lib de cada WAR que formi part del EAR.

Avantatges

  • Tots els mòduls d'un EAR comparteixen un classloader, amb lo que estalviem memòria si es despleguen més d'una aplicació que faci servir el framework en el mateix EAR.

Inconvenients

  • Nomes es a nivell de EAR, es a dir que si volem definir un altra EAR, haurem de desplegar novament les llibreries compartibles.

Opció 2: Publicació al domini

Publiquem les llibreries compartides a tot el servidor d'aplicacions. En el cas de weblogic la carpeta lib associada al domini

Avantatges

  • Estalvi de memòria es molt gran, ja que qualsevol aplicació te accés al classloader d'aquesta manera no nomes es comparteix a nivell de EAR, sinó a nivell de tot el domini.

Inconvenients

  • Tota aplicació desplegada ha de funcionar amb la versió del framework definida per aquest domini. No fer-ho pot portar problemes de versions de llibreries.
  • Un canvi de llibreries publicades al domini implica reiniciar el domini.

Opció 3: Shared libraries (Weblogic)

Publiquem un paquet de jars de forma que es puguin compartir per totes les aplicacions del domini. Aquesta compartició es fa de manera que aquest paquet de jars es publica al classloader de cada EAR que el fa servir, amb lo que aquest estalvi de memòria es equivalent a la opció 1.

Per realitzar aquesta modificació cal desempaquetar tots els jars compartibles, i tornar-los a empaquetar tots junts afegint el MANIFEST amb el nom de la llibreria i la versió de la forma següent:

Manifest-Version: 1.0
Extension-Name: canigo-services-shared
Implementation-Version: 2.2
Specification-Version: 2.2

Després cada EAR que la vulgui fer servir ha de incloure lo següent al weblogic-application.xml

<library-ref>
    <library-name>canigo-services-shared</library-name>
    <specification-version>2.2</specification-version>
    <implementation-version>2.2</implementation-version>
</library-ref>

Avantatges

  • Estalvi de memòria es molt gran, ja que qualsevol aplicació te accés al classloader d'aquesta manera no nomes es comparteix a nivell de EAR, sinó a nivell de tot e domini.

Inconvenients

  • Tota aplicació desplegada ha de funcionar amb la versió del framework definida per aquest domini. No fer-ho pot portar problemes de versions de llibreries.
  • Un canvi de llibreries publicades al domini implica reiniciar el domini.